ã¢ã«ãŽãªãºã å®è£ ã«ãããJavaScriptããŒã¿æ§é ã®ããã©ãŒãã³ã¹åæãæ·±ãæãäžããäžçã®éçºè åãã«æŽå¯ãšå®è·µäŸãæäŸããŸãã
JavaScriptã¢ã«ãŽãªãºã å®è£ ïŒããŒã¿æ§é ã®ããã©ãŒãã³ã¹åæ
ããŒã¹ã®éããœãããŠã§ã¢éçºã®äžçã§ã¯ãå¹çãæãéèŠã§ããäžçäžã®éçºè ã«ãšã£ãŠãããŒã¿æ§é ã®ããã©ãŒãã³ã¹ãçè§£ãåæããããšã¯ãã¹ã±ãŒã©ãã«ã§å¿çæ§ãé«ããå ç¢ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ãããã®èšäºã§ã¯ãJavaScriptã«ãããããŒã¿æ§é ã®ããã©ãŒãã³ã¹åæã®æ žãšãªãæŠå¿µãæ·±ãæãäžããããããããã¯ã°ã©ãŠã³ããæã€ããã°ã©ããŒã«ã°ããŒãã«ãªèŠç¹ãšå®è·µçãªæŽå¯ãæäŸããŸãã
åºç€ïŒã¢ã«ãŽãªãºã ã®ããã©ãŒãã³ã¹ãçè§£ãã
ç¹å®ã®ããŒã¿æ§é ã«é£ã³èŸŒãåã«ãã¢ã«ãŽãªãºã ã®ããã©ãŒãã³ã¹åæã®åºæ¬ååãææ¡ããããšãäžå¯æ¬ ã§ãããã®ããã®äž»èŠãªããŒã«ã¯ããã°ãªãŒèšæ³ã§ããããã°ãªãŒèšæ³ã¯ãå ¥åãµã€ãºãç¡é倧ã«è¿ã¥ãã«ã€ããŠãã¢ã«ãŽãªãºã ã®æéèšç®éãŸãã¯ç©ºéèšç®éã®äžéã衚ããŸããããã«ãããèšèªã«äŸåããªãæšæºåãããæ¹æ³ã§ãããŸããŸãªã¢ã«ãŽãªãºã ãšããŒã¿æ§é ãæ¯èŒã§ããŸãã
æéèšç®é
æéèšç®éãšã¯ãã¢ã«ãŽãªãºã ã®å®è¡ã«ãããæéãå ¥åã®é·ãã®é¢æ°ãšããŠè¡šãããã®ã§ããæéèšç®éã¯ãäžè¬çã«æ¬¡ã®ãããªã¯ã©ã¹ã«åé¡ãããŸãïŒ
- O(1) - 宿°æéïŒ å®è¡æéã¯å ¥åãµã€ãºã«äŸåããŸãããäŸïŒã€ã³ããã¯ã¹ã«ããé åèŠçŽ ãžã®ã¢ã¯ã»ã¹ã
- O(log n) - å¯Ÿæ°æéïŒ å®è¡æéã¯å ¥åãµã€ãºã«å¯ŸããŠå¯Ÿæ°çã«å¢å ããŸããããã¯ãäºåæ¢çŽ¢ã®ããã«åé¡ãç¹°ãè¿ãååã«åå²ããã¢ã«ãŽãªãºã ã§ããèŠãããŸãã
- O(n) - ç·åœ¢æéïŒ å®è¡æéã¯å ¥åãµã€ãºã«æ¯äŸããŠç·åœ¢çã«å¢å ããŸããäŸïŒé åã®å šèŠçŽ ãå埩åŠçããã
- O(n log n) - ç·åœ¢å¯Ÿæ°æéïŒ ããŒãžãœãŒããã¯ã€ãã¯ãœãŒãã®ãããªå¹ççãªãœãŒãã¢ã«ãŽãªãºã ã§äžè¬çãªèšç®éã§ãã
- O(n^2) - äºä¹æéïŒ å®è¡æéã¯å ¥åãµã€ãºã®äºä¹ã§å¢å ããŸããåãå ¥åã«å¯ŸããŠå埩ãããã¹ããããã«ãŒããæã€ã¢ã«ãŽãªãºã ã§ããèŠãããŸãã
- O(2^n) - ææ°æéïŒ å®è¡æéã¯å ¥åãµã€ãºã1ã€å¢ããããšã«åã«ãªããŸããè€éãªåé¡ã«å¯Ÿããç·åœããçãªè§£æ³ã§å žåçã«èŠãããŸãã
- O(n!) - é乿éïŒ å®è¡æéã¯éåžžã«æ¥éã«å¢å ããéåžžã¯é åã«é¢é£ããŠããŸãã
空éèšç®é
空éèšç®éãšã¯ãã¢ã«ãŽãªãºã ã䜿çšããã¡ã¢ãªéãå ¥åã®é·ãã®é¢æ°ãšããŠè¡šãããã®ã§ããæéèšç®éãšåæ§ã«ãããã°ãªãŒèšæ³ãçšããŠè¡šçŸãããŸããããã«ã¯ãè£å©ç©ºéïŒã¢ã«ãŽãªãºã ãå ¥åèªäœä»¥å€ã«äœ¿çšãã空éïŒãšå ¥å空éïŒå ¥åããŒã¿ãå ãã空éïŒãå«ãŸããŸãã
JavaScriptã®äž»èŠãªããŒã¿æ§é ãšãã®ããã©ãŒãã³ã¹
JavaScriptã¯ããã€ãã®çµã¿èŸŒã¿ããŒã¿æ§é ãæäŸããŠãããããè€éãªãã®ãå®è£ å¯èœã§ããäžè¬çãªãã®ã®ããã©ãŒãã³ã¹ç¹æ§ãåæããŠã¿ãŸãããïŒ
1. é å (Arrays)
é åã¯æãåºæ¬çãªããŒã¿æ§é ã®äžã€ã§ããJavaScriptã§ã¯ãé åã¯åçã§ãããå¿ èŠã«å¿ããŠæ¡å€§ã»çž®å°ã§ããŸãããŒãããã€ã³ããã¯ã¹ãå§ãŸããããæåã®èŠçŽ ã¯ã€ã³ããã¯ã¹0ã«ãããŸãã
äžè¬çãªæäœãšãã®ããã°ãªãŒïŒ
- ã€ã³ããã¯ã¹ã«ããèŠçŽ ã¢ã¯ã»ã¹ïŒäŸïŒ`arr[i]`ïŒïŒ O(1) - 宿°æéãé åã¯ã¡ã¢ãªäžã§èŠçŽ ãé£ç¶ããŠæ ŒçŽãããããçŽæ¥ã¢ã¯ã»ã¹ãå¯èœã§ãã
- æ«å°Ÿãžã®èŠçŽ è¿œå ïŒ`push()`ïŒïŒ O(1) - ååŽå®æ°æéããµã€ãºå€æŽãææé·ããããããšããããŸãããå¹³åçã«ã¯éåžžã«é«éã§ãã
- æ«å°Ÿããã®èŠçŽ åé€ïŒ`pop()`ïŒïŒ O(1) - 宿°æéã
- å é ãžã®èŠçŽ è¿œå ïŒ`unshift()`ïŒïŒ O(n) - ç·åœ¢æéãåŸç¶ã®å šèŠçŽ ãããããŠã¹ããŒã¹ãäœãå¿ èŠããããŸãã
- å é ããã®èŠçŽ åé€ïŒ`shift()`ïŒïŒ O(n) - ç·åœ¢æéãåŸç¶ã®å šèŠçŽ ãããããŠééãåããå¿ èŠããããŸãã
- èŠçŽ ã®æ€çŽ¢ïŒäŸïŒ`indexOf()`, `includes()`ïŒïŒ O(n) - ç·åœ¢æéãææªã®å Žåããã¹ãŠã®èŠçŽ ããã§ãã¯ããå¿ èŠããããŸãã
- äžéãžã®èŠçŽ ã®æ¿å ¥ãŸãã¯åé€ïŒ`splice()`ïŒïŒ O(n) - ç·åœ¢æéãæ¿å ¥/åé€ç®æä»¥éã®èŠçŽ ããããå¿ èŠããããŸãã
é åã䜿çšãã¹ãæïŒ
é åã¯ãã€ã³ããã¯ã¹ã«ããé »ç¹ãªã¢ã¯ã»ã¹ãå¿ èŠãªé åºä»ãããŒã¿ã³ã¬ã¯ã·ã§ã³ã®ä¿åããæ«å°Ÿãžã®èŠçŽ ã®è¿œå ã»åé€ãäž»ãªæäœã§ããå Žåã«åªããŠããŸããã°ããŒãã«ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç¹ã«ãã©ãŠã¶ã®ã¡ã¢ãªãå¶çŽãšãªãã¯ã©ã€ã¢ã³ããµã€ãJavaScriptã«ãããŠã倧ããªé åãã¡ã¢ãªäœ¿çšéã«äžãã圱é¿ãèæ ®ããŠãã ããã
äŸïŒ
ã°ããŒãã«ãªeã³ããŒã¹ãã©ãããã©ãŒã ãååIDã远跡ããŠãããšæ³åããŠãã ãããäž»ã«æ°ããIDã远å ããæã 远å é ã§ååŸããå Žåããããã®IDãä¿åããã®ã«é åã¯é©ããŠããŸãã
const productIds = [];
productIds.push('prod-123'); // O(1)
productIds.push('prod-456'); // O(1)
console.log(productIds[0]); // O(1)
2. é£çµãªã¹ã (Linked Lists)
é£çµãªã¹ãã¯ãèŠçŽ ãé£ç¶ããã¡ã¢ãªäœçœ®ã«æ ŒçŽãããªãç·åœ¢ããŒã¿æ§é ã§ããèŠçŽ ïŒããŒãïŒã¯ãã€ã³ã¿ã䜿çšããŠãªã³ã¯ãããŠããŸããåããŒãã¯ããŒã¿ãšãã·ãŒã±ã³ã¹å ã®æ¬¡ã®ããŒããžã®ãã€ã³ã¿ãå«ãã§ããŸãã
é£çµãªã¹ãã®çš®é¡ïŒ
- åæ¹åé£çµãªã¹ãïŒ åããŒãã¯æ¬¡ã®ããŒãã®ã¿ãæããŸãã
- åæ¹åé£çµãªã¹ãïŒ åããŒãã¯æ¬¡ãšåã®äž¡æ¹ã®ããŒããæããŸãã
- 埪ç°é£çµãªã¹ãïŒ æåŸã®ããŒããæåã®ããŒããæãæ»ããŸãã
äžè¬çãªæäœãšãã®ããã°ãªãŒïŒåæ¹åé£çµãªã¹ãïŒïŒ
- ã€ã³ããã¯ã¹ã«ããèŠçŽ ã¢ã¯ã»ã¹ïŒ O(n) - ç·åœ¢æéãå é ãããã©ãå¿ èŠããããŸãã
- å é ïŒheadïŒãžã®èŠçŽ è¿œå ïŒ O(1) - 宿°æéã
- æ«å°ŸïŒtailïŒãžã®èŠçŽ è¿œå ïŒ tailãã€ã³ã¿ãä¿æããŠããå Žåã¯O(1)ãããã§ãªããã°O(n)ã
- å é ïŒheadïŒããã®èŠçŽ åé€ïŒ O(1) - 宿°æéã
- æ«å°Ÿããã®èŠçŽ åé€ïŒ O(n) - ç·åœ¢æéãæåŸãã2çªç®ã®ããŒããèŠã€ããå¿ èŠããããŸãã
- èŠçŽ ã®æ€çŽ¢ïŒ O(n) - ç·åœ¢æéã
- ç¹å®ã®äœçœ®ãžã®èŠçŽ ã®æ¿å ¥ãŸãã¯åé€ïŒ O(n) - ç·åœ¢æéããŸãäœçœ®ãèŠã€ããŠããæäœãå®è¡ããå¿ èŠããããŸãã
é£çµãªã¹ãã䜿çšãã¹ãæïŒ
é£çµãªã¹ãã¯ãå é ãäžéã§ã®é »ç¹ãªæ¿å ¥ã»åé€ãå¿ èŠã§ãã€ã³ããã¯ã¹ã«ããã©ã³ãã ã¢ã¯ã»ã¹ãåªå ãããªãå Žåã«åªããŠããŸããåæ¹åé£çµãªã¹ãã¯ãäž¡æ¹åã«ãã©ããèœåããããããåé€ãªã©ã®ç¹å®ã®æäœãç°¡çŽ åã§ããããšããããã°ãã°å¥œãŸããŸãã
äŸïŒ
鳿¥œãã¬ã€ã€ãŒã®ãã¬ã€ãªã¹ããèããŠã¿ãŠãã ãããïŒäŸãã°ãããã«æ¬¡ã«åçããããã«ïŒæ²ãå é ã«è¿œå ããããã©ãããã§ãæ²ãåé€ãããããã®ã¯äžè¬çãªæäœã§ãããé£çµãªã¹ãã®æ¹ãé åã®èŠçŽ ãããããªãŒããŒããããããå¹ççãªå ŽåããããŸãã
class Node {
constructor(data, next = null) {
this.data = data;
this.next = next;
}
}
class LinkedList {
constructor() {
this.head = null;
this.size = 0;
}
// å
é ã«è¿œå
addFirst(data) {
const newNode = new Node(data, this.head);
this.head = newNode;
this.size++;
}
// ... ä»ã®ã¡ãœãã ...
}
const playlist = new LinkedList();
playlist.addFirst('Song C'); // O(1)
playlist.addFirst('Song B'); // O(1)
playlist.addFirst('Song A'); // O(1)
3. ã¹ã¿ã㯠(Stacks)
ã¹ã¿ãã¯ã¯LIFOïŒLast-In, First-OutãåŸå ¥ãå åºãïŒã®ããŒã¿æ§é ã§ããç¿ã®å±±ãèããŠã¿ãŠãã ãããæåŸã«è¿œå ãããç¿ãæåã«åãé€ãããŸããäž»ãªæäœã¯ `push` ïŒäžçªäžã«è¿œå ïŒãš `pop` ïŒäžçªäžããåé€ïŒã§ãã
äžè¬çãªæäœãšãã®ããã°ãªãŒïŒ
- PushïŒäžçªäžã«è¿œå ïŒïŒ O(1) - 宿°æéã
- PopïŒäžçªäžããåé€ïŒïŒ O(1) - 宿°æéã
- PeekïŒäžçªäžã®èŠçŽ ãèŠãïŒïŒ O(1) - 宿°æéã
- isEmptyïŒ O(1) - 宿°æéã
ã¹ã¿ãã¯ã䜿çšãã¹ãæïŒ
ã¹ã¿ãã¯ã¯ãããã¯ãã©ããã³ã°ïŒäŸïŒãšãã£ã¿ã®å ã«æ»ã/ããçŽãæ©èœïŒãããã°ã©ãã³ã°èšèªã§ã®é¢æ°åŒã³åºãã¹ã¿ãã¯ã®ç®¡çãåŒã®è§£æãªã©ã®ã¿ã¹ã¯ã«æé©ã§ããã°ããŒãã«ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã©ãŠã¶ã®ã³ãŒã«ã¹ã¿ãã¯ã¯æé»çã«æ©èœããŠããã¹ã¿ãã¯ã®ä»£è¡šäŸã§ãã
äŸïŒ
å ±åããã¥ã¡ã³ããšãã£ã¿ã§å ã«æ»ã/ããçŽãæ©èœãå®è£ ããå Žåãåã¢ã¯ã·ã§ã³ã¯å ã«æ»ãã¹ã¿ãã¯ã«ããã·ã¥ãããŸãããŠãŒã¶ãŒããå ã«æ»ãããå®è¡ãããšãæåŸã®ã¢ã¯ã·ã§ã³ãå ã«æ»ãã¹ã¿ãã¯ããããããããããçŽãã¹ã¿ãã¯ã«ããã·ã¥ãããŸãã
const undoStack = [];
undoStack.push('Action 1'); // O(1)
undoStack.push('Action 2'); // O(1)
const lastAction = undoStack.pop(); // O(1)
console.log(lastAction); // 'Action 2'
4. ãã¥ãŒ (Queues)
ãã¥ãŒã¯FIFOïŒFirst-In, First-Outãå å ¥ãå åºãïŒã®ããŒã¿æ§é ã§ããåŸ ã£ãŠãã人ã ã®åãšåæ§ã«ãæåã«åå ãã人ãæåã«ãµãŒãã¹ãåããŸããäž»ãªæäœã¯ `enqueue` ïŒæ«å°Ÿã«è¿œå ïŒãš `dequeue` ïŒå é ããåé€ïŒã§ãã
äžè¬çãªæäœãšãã®ããã°ãªãŒïŒ
- EnqueueïŒæ«å°Ÿã«è¿œå ïŒïŒ O(1) - 宿°æéã
- DequeueïŒå é ããåé€ïŒïŒ O(1) - 宿°æéïŒé£çµãªã¹ãã埪ç°ãããã¡ãªã©ã䜿çšããŠå¹ççã«å®è£ ãããå ŽåïŒãJavaScriptã®é åã§`shift()`ã䜿çšãããšO(n)ã«ãªããŸãã
- PeekïŒå é ã®èŠçŽ ãèŠãïŒïŒ O(1) - 宿°æéã
- isEmptyïŒ O(1) - 宿°æéã
ãã¥ãŒã䜿çšãã¹ãæïŒ
ãã¥ãŒã¯ãããªã³ã¿ãã¥ãŒããµãŒããŒã®ãªã¯ãšã¹ããã¥ãŒãã°ã©ãæ¢çŽ¢ã«ãããå¹ åªå æ¢çŽ¢ïŒBFSïŒãªã©ãå°çããé ã«ã¿ã¹ã¯ã管çããã®ã«æé©ã§ãã忣ã·ã¹ãã ã§ã¯ããã¥ãŒã¯ã¡ãã»ãŒãžãããŒã«ãªã³ã°ã®åºæ¬ã§ãã
äŸïŒ
ç°ãªã倧éžã®ãŠãŒã¶ãŒããã®åä¿¡ãªã¯ãšã¹ããåŠçããWebãµãŒããŒããªã¯ãšã¹ãã¯ãã¥ãŒã«è¿œå ãããå ¬å¹³æ§ã確ä¿ããããã«åä¿¡ããé ã«åŠçãããŸãã
const requestQueue = [];
function enqueueRequest(request) {
requestQueue.push(request); // é
åã®pushã¯O(1)
}
function dequeueRequest() {
// JSé
åã®shift()ã¯O(n)ãªã®ã§ãã«ã¹ã¿ã ãã¥ãŒå®è£
ã䜿çšããæ¹ãè¯ã
return requestQueue.shift();
}
enqueueRequest('Request from User A');
enqueueRequest('Request from User B');
const nextRequest = dequeueRequest(); // array.shift()ã§ã¯O(n)
console.log(nextRequest); // 'Request from User A'
5. ããã·ã¥ããŒãã«ïŒJavaScriptã®Object/MapïŒ
JavaScriptã§ã¯ObjectãMapãšããŠç¥ãããããã·ã¥ããŒãã«ã¯ãããã·ã¥é¢æ°ã䜿çšããŠããŒãé åã®ã€ã³ããã¯ã¹ã«ãããã³ã°ããŸããããã«ãããå¹³åçã«éåžžã«é«éãªæ€çŽ¢ãæ¿å ¥ãåé€ãå¯èœã«ãªããŸãã
äžè¬çãªæäœãšãã®ããã°ãªãŒïŒ
- æ¿å ¥ïŒããŒãšå€ã®ãã¢ïŒïŒ å¹³å O(1)ãææª O(n)ïŒããã·ã¥è¡çªã®ããïŒã
- æ€çŽ¢ïŒããŒã«ããïŒïŒ å¹³å O(1)ãææª O(n)ã
- åé€ïŒããŒã«ããïŒïŒ å¹³å O(1)ãææª O(n)ã
泚æïŒ ææªã®ã·ããªãªã¯ãå€ãã®ããŒãåãã€ã³ããã¯ã¹ã«ããã·ã¥ãããïŒããã·ã¥è¡çªïŒå Žåã«çºçããŸããåªããããã·ã¥é¢æ°ãšè¡çªè§£æ±ºæŠç¥ïŒãã§ã€ã³æ³ããªãŒãã³ã¢ãã¬ã¹æ³ãªã©ïŒã«ããããããæå°éã«æããããšãã§ããŸãã
ããã·ã¥ããŒãã«ã䜿çšãã¹ãæïŒ
ããã·ã¥ããŒãã«ã¯ãäžæã®èå¥åïŒããŒïŒã«åºã¥ããŠã¢ã€ãã ãè¿ éã«æ€çŽ¢ã远å ããŸãã¯åé€ããå¿ èŠãããã·ããªãªã«æé©ã§ããããã«ã¯ããã£ãã·ã¥ã®å®è£ ãããŒã¿ã®ã€ã³ããã¯ã¹äœæãã¢ã€ãã ã®ååšç¢ºèªãªã©ãå«ãŸããŸãã
äŸïŒ
ã°ããŒãã«ãªãŠãŒã¶ãŒèªèšŒã·ã¹ãã ããŠãŒã¶ãŒåïŒããŒïŒã䜿çšããŠãããã·ã¥ããŒãã«ãããŠãŒã¶ãŒããŒã¿ïŒå€ïŒãè¿ éã«ååŸã§ããŸãããã®ç®çã«ã¯ãæåå以å€ã®ããŒã®æ±ãããããã¿ã€ãæ±æã®åé¿ã«åªããŠãããããäžè¬çã«ãã¬ãŒã³ãªãªããžã§ã¯ãããã`Map`ãªããžã§ã¯ãã奜ãŸããŸãã
const userCache = new Map();
userCache.set('user123', { name: 'Alice', country: 'USA' }); // å¹³å O(1)
userCache.set('user456', { name: 'Bob', country: 'Canada' }); // å¹³å O(1)
console.log(userCache.get('user123')); // å¹³å O(1)
userCache.delete('user456'); // å¹³å O(1)
6. æš (Trees)
æšã¯ããšããžã§æ¥ç¶ãããããŒãããæ§æãããéå±€çãªããŒã¿æ§é ã§ãããã¡ã€ã«ã·ã¹ãã ãããŒã¿ããŒã¹ã®ã€ã³ããã¯ã¹äœæãæ€çŽ¢ãªã©ãããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã§åºã䜿çšãããŠããŸãã
äºåæ¢çŽ¢æš (BST):
åããŒããæå€§2ã€ã®åïŒå·Šãšå³ïŒãæã€äºåæšã§ããä»»æã®ããŒãã«ã€ããŠããã®å·Šéšåæšã«ãããã¹ãŠã®å€ã¯ããŒãã®å€ããå°ãããå³éšåæšã«ãããã¹ãŠã®å€ã¯å€§ãããªããŸãã
- æ¿å ¥ïŒ å¹³å O(log n)ãææª O(n)ïŒæšãé£çµãªã¹ãã®ããã«åã£ãå ŽåïŒã
- æ€çŽ¢ïŒ å¹³å O(log n)ãææª O(n)ã
- åé€ïŒ å¹³å O(log n)ãææª O(n)ã
å¹³åO(log n)ãéæããããã«ã¯ãæšã平衡ã§ããå¿ èŠããããŸããAVLæšãèµ€é»æšã®ãããªæè¡ã¯å¹³è¡¡ãä¿ã¡ã察æ°çãªããã©ãŒãã³ã¹ãä¿èšŒããŸããJavaScriptã«ã¯ãããã¯çµã¿èŸŒãŸããŠããŸããããå®è£ ããããšã¯å¯èœã§ãã
æšã䜿çšãã¹ãæïŒ
BSTã¯ãé åºä»ããããããŒã¿ã®å¹ççãªæ€çŽ¢ãæ¿å ¥ãåé€ãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã«åªããŠããŸããã°ããŒãã«ãªãã©ãããã©ãŒã ã§ã¯ãããŒã¿ã®ååžãæšã®å¹³è¡¡ãšããã©ãŒãã³ã¹ã«ã©ã®ããã«åœ±é¿ããããèæ ®ããŠãã ãããäŸãã°ãããŒã¿ãå³å¯ã«æé ã§æ¿å ¥ãããå ŽåãåçŽãªBSTã¯O(n)ã®ããã©ãŒãã³ã¹ã«äœäžããŸãã
äŸïŒ
è¿ éãªæ€çŽ¢ã®ããã«ãœãŒããããåœã³ãŒãã®ãªã¹ããæ ŒçŽããæ°ããåœã远å ãããŠãæäœãå¹ççã§ããç¶ããããšãä¿èšŒããŸãã
// åçŽåãããBSTã®æ¿å
¥ïŒé平衡ïŒ
function insertBST(root, value) {
if (!root) return { value: value, left: null, right: null };
if (value < root.value) {
root.left = insertBST(root.left, value);
} else {
root.right = insertBST(root.right, value);
}
return root;
}
let bstRoot = null;
bstRoot = insertBST(bstRoot, 50); // å¹³å O(log n)
bstRoot = insertBST(bstRoot, 30); // å¹³å O(log n)
bstRoot = insertBST(bstRoot, 70); // å¹³å O(log n)
// ... ãªã© ...
7. ã°ã©ã (Graphs)
ã°ã©ãã¯ãããŒãïŒé ç¹ïŒãšããããçµã¶ãšããžããæ§æãããéç·åœ¢ããŒã¿æ§é ã§ãããœãŒã·ã£ã«ãããã¯ãŒã¯ãéè·¯å°å³ãã€ã³ã¿ãŒããããªã©ããªããžã§ã¯ãéã®é¢ä¿ãã¢ãã«åããããã«äœ¿çšãããŸãã
è¡šçŸæ¹æ³ïŒ
- 飿¥è¡åïŒ é ç¹`i`ãšé ç¹`j`ã®éã«ãšããžãããå Žåã«`matrix[i][j] = 1`ãšãªã2次å é åã
- 飿¥ãªã¹ãïŒ ãªã¹ãã®é åã§ãåã€ã³ããã¯ã¹`i`ã«ã¯é ç¹`i`ã«é£æ¥ããé ç¹ã®ãªã¹ããå«ãŸããŸãã
äžè¬çãªæäœïŒé£æ¥ãªã¹ãã䜿çšïŒïŒ
- é ç¹ã®è¿œå ïŒ O(1)
- ãšããžã®è¿œå ïŒ O(1)
- 2é ç¹éã®ãšããžã®ç¢ºèªïŒ O(é ç¹ã®æ¬¡æ°) - 飿¥ããé ç¹ã®æ°ã«æ¯äŸããŸãã
- æ¢çŽ¢ïŒäŸïŒBFS, DFSïŒïŒ O(V + E)ãããã§Vã¯é ç¹ã®æ°ãEã¯ãšããžã®æ°ã§ãã
ã°ã©ãã䜿çšãã¹ãæïŒ
ã°ã©ãã¯è€éãªé¢ä¿ãã¢ãã«åããããã«äžå¯æ¬ ã§ããäŸãšããŠã¯ãã«ãŒãã£ã³ã°ã¢ã«ãŽãªãºã ïŒGoogleããããªã©ïŒãæšèŠãšã³ãžã³ïŒäŸïŒãç¥ãåããããïŒããããã¯ãŒã¯åæãªã©ããããŸãã
äŸïŒ
ãŠãŒã¶ãŒãé ç¹ã§ãå人é¢ä¿ããšããžã§ãããœãŒã·ã£ã«ãããã¯ãŒã¯ã衚çŸããå Žåãå ±éã®å人ãèŠã€ãããããŠãŒã¶ãŒéã®æççµè·¯ãèŠã€ãããããã«ã¯ãã°ã©ãã¢ã«ãŽãªãºã ãé¢ãã£ãŠããŸãã
const socialGraph = new Map();
function addVertex(vertex) {
if (!socialGraph.has(vertex)) {
socialGraph.set(vertex, []);
}
}
function addEdge(v1, v2) {
addVertex(v1);
addVertex(v2);
socialGraph.get(v1).push(v2);
socialGraph.get(v2).push(v1); // ç¡åã°ã©ãã®å Žå
}
addEdge('Alice', 'Bob'); // O(1)
addEdge('Alice', 'Charlie'); // O(1)
// ...
é©åãªããŒã¿æ§é ã®éžæïŒã°ããŒãã«ãªèŠç¹
ããŒã¿æ§é ã®éžæã¯ãç¹ã«ã¢ããªã±ãŒã·ã§ã³ãããŸããŸãªãããã¯ãŒã¯ç¶æ³ãããã€ã¹èœåãæã€äœçŸäžäººãã®ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããå¯èœæ§ãããã°ããŒãã«ãªæèã«ãããŠãJavaScriptã¢ã«ãŽãªãºã ã®ããã©ãŒãã³ã¹ã«é倧ãªåœ±é¿ãäžããŸãã
- ã¹ã±ãŒã©ããªãã£ïŒ éžæããããŒã¿æ§é ã¯ããŠãŒã¶ãŒããŒã¹ãããŒã¿éãå¢å ããã«ã€ããŠæé·ãå¹ççã«åŠçã§ããŸããïŒ äŸãã°ãæ¥éãªã°ããŒãã«å±éãçµéšããŠãããµãŒãã¹ã«ã¯ãã³ã¢æäœã®ããã«O(1)ãŸãã¯O(log n)ã®èšç®éãæã€ããŒã¿æ§é ãå¿ èŠã§ãã
- ã¡ã¢ãªå¶çŽïŒ ãªãœãŒã¹ãéãããç°å¢ïŒäŸïŒå€ãã¢ãã€ã«ããã€ã¹ããŸãã¯ã¡ã¢ãªãéããããã©ãŠã¶å ïŒã§ã¯ã空éèšç®éãéèŠã«ãªããŸããå€§èŠæš¡ãªã°ã©ãã®é£æ¥è¡åã®ãããªäžéšã®ããŒã¿æ§é ã¯ãéå°ãªã¡ã¢ãªãæ¶è²»ããå¯èœæ§ããããŸãã
- äžŠè¡æ§ïŒ 忣ã·ã¹ãã ã§ã¯ãããŒã¿æ§é ã¯ã¹ã¬ããã»ãŒãã§ããããç«¶åç¶æ ãé¿ããããã«æ éã«ç®¡çãããå¿ èŠããããŸãããã©ãŠã¶ã®JavaScriptã¯ã·ã³ã°ã«ã¹ã¬ããã§ãããNode.jsç°å¢ãWeb Workerã¯äžŠè¡æ§ã®èæ ®äºé ãå°å ¥ããŸãã
- ã¢ã«ãŽãªãºã ã®èŠä»¶ïŒ 解決ããããšããŠããåé¡ã®æ§è³ªããæé©ãªããŒã¿æ§é ãæ±ºå®ããŸããã¢ã«ãŽãªãºã ãé »ç¹ã«äœçœ®ã«ãã£ãŠèŠçŽ ã«ã¢ã¯ã»ã¹ããå¿ èŠãããå Žåã¯ãé åãé©ããŠãããããããŸãããèå¥åã«ããé«éãªæ€çŽ¢ãå¿ èŠãªå Žåã¯ãããã·ã¥ããŒãã«ããã°ãã°åªããŠããŸãã
- èªã¿åã vs. æžãèŸŒã¿æäœïŒ ã¢ããªã±ãŒã·ã§ã³ãèªã¿åãäžå¿ãæžã蟌ã¿äžå¿ããåæããŸããäžéšã®ããŒã¿æ§é ã¯èªã¿åãã«æé©åãããŠãããä»ã¯æžã蟌ã¿ã«ããŸãäžéšã¯ãã©ã³ã¹ãåããŠããŸãã
ããã©ãŒãã³ã¹åæããŒã«ãšãã¯ããã¯
çè«çãªããã°ãªãŒåæãè¶ ããŠãå®è·µçãªæž¬å®ãäžå¯æ¬ ã§ãã
- ãã©ãŠã¶éçºè ããŒã«ïŒ ãã©ãŠã¶éçºè ããŒã«ïŒChrome, Firefoxãªã©ïŒã®ããã©ãŒãã³ã¹ïŒPerformanceïŒã¿ãã䜿çšãããšãJavaScriptã³ãŒãããããã¡ã€ãªã³ã°ããããã«ããã¯ãç¹å®ããå®è¡æéãèŠèŠåã§ããŸãã
- ãã³ãããŒã¯ã©ã€ãã©ãªïŒ `benchmark.js`ã®ãããªã©ã€ãã©ãªã䜿çšãããšãå¶åŸ¡ãããæ¡ä»¶äžã§ããŸããŸãªã³ãŒãã¹ããããã®ããã©ãŒãã³ã¹ã枬å®ã§ããŸãã
- è² è·ãã¹ãïŒ ãµãŒããŒãµã€ãã¢ããªã±ãŒã·ã§ã³ïŒNode.jsïŒã®å ŽåãApacheBench (ab)ãk6ãJMeterãªã©ã®ããŒã«ã§é«è² è·ãã·ãã¥ã¬ãŒãããããŒã¿æ§é ãã¹ãã¬ã¹äžã§ã©ã®ããã«åäœãããããã¹ãã§ããŸãã
äŸïŒé åã®`shift()` vs. ã«ã¹ã¿ã ãã¥ãŒã®ãã³ãããŒã¯
åè¿°ã®éããJavaScripté åã®`shift()`æäœã¯O(n)ã§ããããã¥ãŒãå€çšããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã¯é倧ãªããã©ãŒãã³ã¹åé¡ã«ãªãå¯èœæ§ããããŸããåºæ¬çãªæ¯èŒãæ³åããŠã¿ãŸãããïŒ
// é£çµãªã¹ãã2ã€ã®ã¹ã¿ãã¯ã䜿çšããåçŽãªã«ã¹ã¿ã Queueå®è£
ãæ³å®
// ç°¡åã«ãããããæŠå¿µã瀺ãã ãã«ããŸãã
function benchmarkQueueOperations(size) {
console.log(`Benchmarking with size: ${size}`);
// é
åã«ããå®è£
const arrayQueue = Array.from({ length: size }, (_, i) => i);
console.time('Array Shift');
while (arrayQueue.length > 0) {
arrayQueue.shift(); // O(n)
}
console.timeEnd('Array Shift');
// ã«ã¹ã¿ã ãã¥ãŒå®è£
ïŒæŠå¿µïŒ
// const customQueue = new EfficientQueue();
// for (let i = 0; i < size; i++) {
// customQueue.enqueue(i);
// }
// console.time('Custom Queue Dequeue');
// while (!customQueue.isEmpty()) {
// customQueue.dequeue(); // O(1)
// }
// console.timeEnd('Custom Queue Dequeue');
}
// benchmarkQueueOperations(10000); // 倧ããªéãã芳å¯ã§ããã§ããã
ãã®å®è·µçãªåæã¯ãçµã¿èŸŒã¿ã¡ãœããã®æ ¹æ¬çãªããã©ãŒãã³ã¹ãçè§£ããããšããªãäžå¯æ¬ ã§ããããæµ®ã圫ãã«ããŸãã
çµè«
JavaScriptã®ããŒã¿æ§é ãšãã®ããã©ãŒãã³ã¹ç¹æ§ãç¿åŸããããšã¯ãé«å質ã§å¹ççããã€ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ãç®æãããããéçºè ã«ãšã£ãŠäžå¯æ¬ ãªã¹ãã«ã§ããããã°ãªãŒèšæ³ãšãé åãé£çµãªã¹ããã¹ã¿ãã¯ããã¥ãŒãããã·ã¥ããŒãã«ãæšãã°ã©ããšãã£ãç°ãªãæ§é ã®ãã¬ãŒããªããçè§£ããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®æåã«çŽæ¥åœ±é¿ããæ å ±ã«åºã¥ããæææ±ºå®ãã§ããŸããç¶ç¶çãªåŠç¿ãšå®è·µçãªå®éšãåãå ¥ããã¹ãã«ã磚ããã°ããŒãã«ãªãœãããŠã§ã¢éçºã³ãã¥ããã£ã«å¹æçã«è²¢ç®ããŠãã ããã
ã°ããŒãã«éçºè åãã®éèŠãªãã€ã³ãïŒ
- ããã°ãªãŒèšæ³ã®çè§£ãåªå ããïŒ èšèªã«äŸåããªãããã©ãŒãã³ã¹è©äŸ¡ã®ããã«ã
- ãã¬ãŒããªããåæããïŒ ãã¹ãŠã®ç¶æ³ã«å®ç§ãªããŒã¿æ§é ã¯ãããŸãããã¢ã¯ã»ã¹ãã¿ãŒã³ãæ¿å ¥/åé€ã®é »åºŠãã¡ã¢ãªäœ¿çšéãèæ ®ããŠãã ããã
- 宿çã«ãã³ãããŒã¯ãè¡ãïŒ çè«çãªåæã¯ã¬ã€ãã§ãããæé©åã®ããã«ã¯å®éã®æž¬å®ãäžå¯æ¬ ã§ãã
- JavaScriptã®ä»æ§ã«æ³šæããïŒ çµã¿èŸŒã¿ã¡ãœããïŒäŸïŒé åã®`shift()`ïŒã®ããã©ãŒãã³ã¹ã®ãã¥ã¢ã³ã¹ãçè§£ããŠãã ããã
- ãŠãŒã¶ãŒã³ã³ããã¹ããèæ ®ããïŒ ã¢ããªã±ãŒã·ã§ã³ãäžçäžã®å€æ§ãªç°å¢ã§å®è¡ãããããšãèããŠãã ããã
ãœãããŠã§ã¢éçºã®æ ãç¶ããäžã§ãããŒã¿æ§é ãšã¢ã«ãŽãªãºã ãžã®æ·±ãçè§£ããäžçäžã®ãŠãŒã¶ãŒã®ããã«é©æ°çã§ããã©ãŒãã³ã¹ã®é«ããœãªã¥ãŒã·ã§ã³ãäœæããããã®åŒ·åãªããŒã«ã§ããããšãå¿ããªãã§ãã ããã